package com.atguigu.chaptar6

object $04_CollectionHightFunction {
  //高级计算函数
  def main(args: Array[String]): Unit = {
    val list = List(10,2,5,3,6,8,7)
    //1.根据指定规则过滤filter(func: 集合元素类型=>Boolean) 函数针对集合每个元素进行操作,保留的是函数返回值为true的元素
      val list1 = list.filter(_ % 2 == 0)//需求:元素中只要偶数
    //2.映射map(func: 集合元素类型=>B) 数据转换函数:数据的值转换\数据的类型转换  函数针对集合每个元素进行操作,每个元素操作后返回一个结果,元素操作=>元素返回:应用于一对一场景
    val list2 = List("hello","spark","scala","hadoop")
    val list3 = list2.map(_.length)//需求:将集合每个元素转换成元素长度
    //3.扁平flatten,适用于集合套集合的数据格式   将第二层集合扁平化,用于一对多:第二层的集合扁平成元素(把List(a,b)拆开了)  只能用于两层集合,三层不行
    val list4 = List[List[String]](
      List("aa","bb","cc"),
      List("dd","ee"),
      List("tt","rr"))
    val list5 = list4.flatten //扁平成: List(aa, bb, cc, dd, ee, tt, rr)
    val list6 = List[String]("hello", "spark")
    val list7 = list6.flatten //扁平成List(h, e, l, l, o, s, p, a, r, k),因为字符串也是集合
    //4.flatmap(func: 集合元素类型=>集合) 应用场景:一对多   为什么里面的函数返回的是集合?因为得先map转换成集合,才能进行flat
      val list8 = List("hello spark java", "scala flume")
    val list9 = list8.flatMap(_.split(" ")) //传入的匿名函数将元素转化成集合,然后自动flat
    //5.foreach(func: 元素类型=>U):对每个元素处理,不需要返回结果    与map的区别:map有返回值,foreach没有
    list.foreach(println(_))
    //6.根据指定字段分组groupBy(func: 集合元素=>K)    groupBy返回的是一个Map,Map里面的key是函数的返回值K,value是key在原集合中对应所有的元素,是一个List
    val list10 = List("zhangsan" -> "nan", "lisi" -> "nv", "wangwu" -> "nan")
    val map = list10.groupBy(_._2)
    //7.规约聚合reduce(func:(集合元素类型,集合元素类型)=>集合元素类型)
      //reduce是从左向右计算 (agg,curr)=>agg+curr   第一次计算:agg=集合第一个元素 curr:第二个元素  第N次计算: agg=上一次计算结果 curr:第N+1个元素
    println("===================")
    println(list.reduce((agg, curr) => {
      println(s"agg=${agg} curr=${curr}")
      agg - curr}))
    //8.规约聚合reduceRight   reduceRight是从右向左计算
    println(list.reduceRight((curr, agg) => {
      println(s"agg=${agg} curr=${curr}")
      agg - curr}))
    //9.折叠fold(默认值)(func: (集合元素类型,集合元素类型)=>集合元素类型)   从左向右聚合   与reduce唯一的区别:fold第一次计算的时候agg有默认值,
    // reduce是将集合第一个元素作为agg初始值
    list.fold(100)((agg,curr)=>{
      println(s"agg=${agg} curr=${curr}")
      agg-curr})
    //10.折叠foldRight   从右向左聚合   与reduceRight唯一区别:foldRight第一次计算的时候agg有默认值,reduceRight是将集合最后一个元素作为agg的初始值
    list.foldRight(100)((curr,agg)=>{
      println(s"agg=${agg} curr=${curr}")
      agg-curr})}

}
